# encoding: utf-8
"""
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    created by lane.chang on '28/05/2024'
    comment: 用户意图相关逻辑
"""
import re
import datetime
import asyncio

import ujson

from project.middleware.chatgpt import ChatGPT
from project.lib.common import logger


class CommonService:
    """
    """
    @staticmethod
    def llm_response_handler(llm_response):
        """
        :param llm_response:
        :return:
        """
        try:
            res = ujson.loads(llm_response)
        except ujson.JSONDecodeError:
            try:
                res = eval(llm_response)
            except Exception as ex:
                logger.critical(f'格式解析错误text: {llm_response}', exc_info=True)
                raise ex

        return res

    @staticmethod
    async def inference_user_date_async(user_message):
        """ 推理用户所指定的日期
        :param user_message:
        :return:
        """
        prompt = f"""
            请判断用户当前消息指的是"哪一天" 或是 "哪些天"？以#基准日为基准进行判断。 请按输出格式要求输出，并输出你的推理过程。
            <大前天>是指#基准日的前三天
            <大后天>是指#基准日的后三天
            
            #用户当前消息
            {user_message}
            
            #基准日
            {datetime.datetime.now().strftime('%Y-%m-%d')} 
            
            # 输出格式：
            当<文本>中包含跟日期时间有关信息时： <reason>你的推理过程...</reason><result>日期字符串('%Y-%m-%d')列表</result>
            当<文本>中不包含日期时间有关信息时：<reason>你的推理过程...</reason><result>[]</result>
            
            # 输出样例
            用户对你说："我昨晚睡的怎样？" <reason>用户提到了"昨晚", 就是指前一天晚上。如果当天基准日是2024-07-04，则前一天就是2024-07-03</reason><result>[\'2024-07-03\']</result>
            用户对你说："我大前天上课了？" <reason>用户提到了"大前天", 就是指基准日的前三天。如果当天基准日是2024-07-04，则前一天就是2024-07-01</reason><result>[\'2024-07-01\']</result>
            用户对你说："给我看下7月1号的睡眠报告" <reason>用户提到了"7月1号", 非常明确的日期信息, 不需要通过基准日计算就能确定用户说的是7月1号</reason><result>[\'2024-07-01\']</result>
            用户对你说："7月10日的睡眠报告能给我看看吗" <reason>用户提到了"7月10号", 非常明确的日期信息, 不需要通过基准日计算就能确定用户说的是7月10号</reason><result>[\'2024-07-10\']</result>
    
        """
        chat_gpt = ChatGPT(temperature=0)
        data = await chat_gpt.json_loads_content(user_text=prompt, tags=('reason', 'result'))

        result = data.get('result')
        if result and isinstance(result, str):
            result = CommonService.llm_response_handler(result)

        if not result:
            result = re.findall(r"\['\d{4}-\d{2}-\d{2}'\]", data.get('gpt_logic', ''))
            if result:
                result = eval(result[-1])

        data['result'] = result or []

        return data


if __name__ == '__main__':

    text = "能否给我8月10日的睡眠情况？ "
    # text = "后天的睡眠报告？"
    # text = "上周五的睡眠报告"
    data = asyncio.run(CommonService.inference_user_date_async(text))
    print(data)
